﻿using System;
using System.Collections.Generic;
using System.Text;

namespace AzManADAMStore
{
    /// <summary>
    /// Clase que encapsula el perfil de un usuario
    /// </summary>
    public class UserProfileDefinition
    {
        /// <summary>
        /// Nombre del usuario
        /// </summary>
        public string UserName;

        /// <summary>
        /// Lista de toles asignados
        /// </summary>
        public Role.RoleList Roles;


        public UserProfileDefinition(string UserName)
        {
            this.UserName = UserName;
            this.Roles = new Role.RoleList();
        }



        /// <summary>
        /// Indica si el usuario pertence al rol indicado
        /// </summary>
        /// <param name="RoleName">Rol a buscar</param>
        /// <returns></returns>
        public bool IsUserInRole(string RoleName)
        {
            try
            {
                bool res = false;
                if (string.IsNullOrEmpty(RoleName))
                    return false;         
       
                return IsUserInRole(RoleName, this.Roles);
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Indica si el usuario pertence al rol indicado
        /// </summary>
        /// <param name="RoleName">Rol a buscar</param>
        /// <param name="RolesList"></param>
        /// <returns></returns>
        internal bool IsUserInRole(string RoleName, Role.RoleList RolesList)
        {
            try
            {
                bool res = false;
                if (!string.IsNullOrEmpty(RoleName))
                    if (RolesList != null)
                        if (RolesList.ContainsKey(RoleName))
                            res = true;
                        else
                            foreach (Role rol in RolesList.Values)
                                if ((res = IsUserInRole(RoleName, rol.Roles)))
                                    break;

                return res;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Indica si el usuario actual tiene asignado la tarea indicada
        /// </summary>
        /// <param name="TaskName">Nombre de la tarea a validar</param>
        /// <returns></returns>
        public bool IsUserInTask(string TaskName)
        {
            try
            {
                if (string.IsNullOrEmpty(TaskName))
                    return false;

                return IsUserInTask(TaskName, this.Roles);
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Indica si el usuario actual tiene asignado la tarea indicada
        /// </summary>
        /// <param name="TaskName">Nombre de la tarea a validar</param>
        /// <param name="RolesList">r</param>
        /// <returns></returns>
        internal bool IsUserInTask(string TaskName, Role.RoleList RolesList)
        {
            try
            {
                bool res = false;
                if (!string.IsNullOrEmpty(TaskName))
                    if (RolesList != null)
                        foreach (Role rol in RolesList.Values)
                        {
                            if(rol.Tasks != null)
                                if(rol.Tasks.ContainsKey(TaskName))
                                    res = true;
                                else
                                    foreach (Task task in rol.Tasks.Values)
                                        if ((res = IsUserInTask(TaskName, task.Tasks)))
                                            break;

                            if(!res)
                                res = IsUserInTask(TaskName, rol.Roles);
                        }

                return res;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Indica si el usuario actual tiene asignado la tarea indicada
        /// </summary>
        /// <param name="TaskName">Nombre de la tarea a validar</param>
        /// <param name="TaskList"></param>
        /// <returns></returns>
        internal bool IsUserInTask(string TaskName, Task.TaskList TaskList)
        {
            try
            {
                bool res = false;
                if (!string.IsNullOrEmpty(TaskName))
                    if (TaskList != null)
                        if (TaskList.ContainsKey(TaskName))
                            res = true;
                        else
                            foreach (Task task in TaskList.Values)
                                if ((res = IsUserInTask(TaskName, task.Tasks)))
                                    break;

                return res;
            }
            catch
            {
                return false;
            }
        }


        /// <summary>
        /// Indica si el usuario actual tiene asignado la tarea indicada.
        /// Una operación debería de estar asociada a una tarea.
        /// </summary>
        /// <param name="TaskName">Nombre de la tarea que contiene la operación</param>
        /// <param name="OperationName">Nombre de la operación a validar</param>
        /// <returns></returns>
        public bool IsUserInTaskOperation(string TaskName, string OperationName)
        {
            try
            {
                if (string.IsNullOrEmpty(TaskName))
                    return false;

                if (string.IsNullOrEmpty(OperationName))
                    return false;

                return IsUserInTaskOperation(TaskName, OperationName, this.Roles);
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Indica si el usuario actual tiene asignado la tarea indicada
        /// </summary>
        /// <param name="TaskName">Nombre de la tarea a validar</param>
        /// <param name="OperationName"></param>
        /// <param name="RolesList">r</param>
        /// <returns></returns>
        internal bool IsUserInTaskOperation(string TaskName, string OperationName, Role.RoleList RolesList)
        {
            try
            {
                bool res = false;
                if (!string.IsNullOrEmpty(TaskName))
                    if (RolesList != null)
                        foreach (Role rol in RolesList.Values)
                        {
                            if (rol.Tasks != null)
                                if (rol.Tasks.ContainsKey(TaskName))
                                    res = (rol.Tasks[TaskName].Operations.ContainsKey(OperationName));
                                else
                                    foreach (Task task in rol.Tasks.Values)
                                        if ((res = IsUserInTaskOperation(TaskName, OperationName, task.Tasks)))
                                            break;

                            if (!res)
                                res = IsUserInTaskOperation(TaskName, OperationName, rol.Roles);
                        }

                return res;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Indica si el usuario actual tiene asignado la tarea indicada
        /// </summary>
        /// <param name="TaskName">Nombre de la tarea a validar</param>
        /// <param name="OperationName"></param>
        /// <param name="TaskList"></param>
        /// <returns></returns>
        internal bool IsUserInTaskOperation(string TaskName, string OperationName, Task.TaskList TaskList)
        {
            try
            {
                bool res = false;
                if (!string.IsNullOrEmpty(TaskName))
                    if (TaskList != null)
                        if (TaskList.ContainsKey(TaskName))
                            res = (TaskList[TaskName].Operations.ContainsKey(OperationName));
                        else
                            foreach (Task task in TaskList.Values)
                                if ((res = IsUserInTaskOperation(TaskName, OperationName, task.Tasks)))
                                    break;

                return res;
            }
            catch
            {
                return false;
            }
        }

    }
}
